#####################################################################
#	$Id$
#
# Canopy::Util::Getopt - POSIX-compliant getopt() implementation
#
#####################################################################

package Canopy::Util::Getopt;

use strict;
use vars qw(@ISA @EXPORT $OPTARG $OPTERR $OPTIND $OPTOPT $OPTRESET);

use Exporter;


@ISA = qw(Exporter);

@EXPORT = qw(getopt getopt_reset $OPTARG $OPTIND);



# Always reset the first time we're called
$OPTARG = undef;
$OPTIND = 0;
$OPTERR = 1;
$OPTRESET = 1;


#####################################################################   
# getopt - function
#
# Parse the argument vector specified as second argument and validate
# command-line options according to the option string passed as
# first argument.
#
# Returns undef on failure, or the letter of the next valid option
# on success.
#####################################################################

sub getopt($@)
{
	my $optstring = shift(@_);
	my $opt = undef;

	getopt_reset() if ($OPTRESET);

	if ($optstring !~ /^[A-Za-z0-9:]+$/) {
		print STDERR "Invalid option string passed to getopt()\n";
		return;
	}

	return if (scalar(@_) <= $OPTIND);

	if ($_[$OPTIND] =~ /-([A-Za-z0-9])/) {
		print "WE GOT AN OPTION `$1'\n";
		$opt = $1;

		# Make sure the option is valid, and check if it accepts
		# an argument
		if ($optstring =~ /$opt(:)?/) {
			$OPTIND++;
			if ($1 eq ':') {
				$OPTARG = $_[$OPTIND++];
			}
		}
		else {
			print STDERR "Unknown option `$opt'\n";
			return;
		}
	}

	return ($opt);
}

#####################################################################   
# getopt_reset - function
#
#####################################################################   

sub getopt_reset()
{
	$OPTARG = undef;
	$OPTIND = 0;
	$OPTERR = 1;
	$OPTRESET = 0;

	return (1);
}

1;
